package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.common.cache.GmallCache;
import com.atguigu.gmall.product.mapper.*;
import com.atguigu.gmall.product.model.*;
import com.atguigu.gmall.product.service.SpuManageService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * @author: atguigu
 * @create: 2022-12-24 14:10
 */
@Slf4j
@Service
@SuppressWarnings("all")
public class SpuManageServiceImpl implements SpuManageService {


    @Autowired
    private SpuInfoMapper spuInfoMapper;

    @Autowired
    private BaseSaleAttrMapper baseSaleAttrMapper;

    @Autowired
    private SpuImageMapper spuImageMapper;

    @Autowired
    private SpuPosterMapper spuPosterMapper;

    @Autowired
    private SpuSaleAttrMapper spuSaleAttrMapper;

    @Autowired
    private SpuSaleAttrValueMapper spuSaleAttrValueMapper;


    /**
     * 根据分类ID查询Spu分页列表
     *
     * @param iPage
     * @param spuInfo
     * @return
     */
    @Override
    public IPage<SpuInfo> getSpuInfoPage(IPage<SpuInfo> iPage, SpuInfo spuInfo) {
        //1.构建page对象 已传入

        //2.构建分页查询条件
        LambdaQueryWrapper<SpuInfo> queryWrapper = new LambdaQueryWrapper<>();
        if (spuInfo.getCategory3Id() != null) {
            queryWrapper.eq(SpuInfo::getCategory3Id, spuInfo.getCategory3Id());
        }
        //根据修改时间进行倒序
        queryWrapper.orderByDesc(SpuInfo::getUpdateTime);

        //3.执行分页返回
        return spuInfoMapper.selectPage(iPage, queryWrapper);

    }

    /**
     * 加载平台中所有的销售属性名称列表
     *
     * @return
     */
    @Override
    public List<BaseSaleAttr> baseSaleAttrList() {
        return baseSaleAttrMapper.selectList(null);
    }


    /**
     * 保存商品SPU信息
     * 1.保存商品基本信息到spu_info表
     * 2.保存商品图片到spu_image表 关联到商品spu
     * 3.保存商品海报图片到spu_poster表 关联到商品spu
     * 4.保存商品Spu对应的销售属性名称到spu_sale_attr表中 。。
     * 5.保存商品Spu对应销售属性值表到spu_sale_attr_value表 。。
     *
     * @param spuInfo
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveSpuInfo(SpuInfo spuInfo) {
        //1.保存商品基本信息到spu_info表 商品信息对象中主键属性有值
        spuInfoMapper.insert(spuInfo);

        //2.保存商品图片到spu_image表 关联到商品spu
        if (!CollectionUtils.isEmpty(spuInfo.getSpuImageList())) {
            for (SpuImage spuImage : spuInfo.getSpuImageList()) {
                //将图片关联到商品SPU
                spuImage.setSpuId(spuInfo.getId());
                spuImageMapper.insert(spuImage);
            }
        }
        //3.保存商品海报图片到spu_poster表 关联到商品spu
        if (!CollectionUtils.isEmpty(spuInfo.getSpuPosterList())) {
            for (SpuPoster spuPoster : spuInfo.getSpuPosterList()) {
                spuPoster.setSpuId(spuInfo.getId());
                spuPosterMapper.insert(spuPoster);
            }
        }
        //4.保存商品Spu对应的销售属性名称到spu_sale_attr表中 。。
        if (!CollectionUtils.isEmpty(spuInfo.getSpuSaleAttrList())) {
            for (SpuSaleAttr spuSaleAttr : spuInfo.getSpuSaleAttrList()) {
                //4.1 处理销售属性名称对象 关联商品SPU
                spuSaleAttr.setSpuId(spuInfo.getId());
                //4.2 执行保存spu销售属性名称
                spuSaleAttrMapper.insert(spuSaleAttr);

                //5.保存商品Spu对应销售属性值表到spu_sale_attr_value表 。。
                //处理当前spu销售属性对应商品销售属性值集合
                if (!CollectionUtils.isEmpty(spuSaleAttr.getSpuSaleAttrValueList())) {
                    for (SpuSaleAttrValue spuSaleAttrValue : spuSaleAttr.getSpuSaleAttrValueList()) {
                        //手动关联商品SpuID
                        spuSaleAttrValue.setSpuId(spuInfo.getId());
                        //设置当前销售属性值对应属性名称
                        spuSaleAttrValue.setSaleAttrName(spuSaleAttr.getSaleAttrName());
                        spuSaleAttrValueMapper.insert(spuSaleAttrValue);
                    }
                }
            }
        }
    }

    /**
     * 根据商品SPUID查询销售属性名称以及值
     *
     * @param spuId
     * @return
     */
    @Override
    public List<SpuSaleAttr> getSpuSaleAttrList(Long spuId) {
        //方式一：根据SPUID查询销售属性集合，在遍历销售属性集合根据销售属性ID查询属性值 需要执行两条SQL
        //方式二:编写动态SQL完成查询，通过查询Spu销售属性表以及Spu销售属性值表
        List<SpuSaleAttr> spuSaleAttrList = spuSaleAttrMapper.getSpuSaleAttrList(spuId);
        return spuSaleAttrList;
    }

    /**
     * 查询指定Spu的图片列表
     *
     * @param spuId
     * @return
     */
    @Override
    public List<SpuImage> getSpuImageList(Long spuId) {
        LambdaQueryWrapper<SpuImage> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SpuImage::getSpuId, spuId);
        return spuImageMapper.selectList(queryWrapper);
    }

    /**
     * 根据商品SPUID查询商品海报列表
     *
     * @param spuId 商品SPUID
     * @return
     */
    @Override
    @GmallCache(prefix = "spuPosterBySpuId:")
    public List<SpuPoster> findSpuPosterBySpuId(Long spuId) {
        LambdaQueryWrapper<SpuPoster> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SpuPoster::getSpuId, spuId);
        return spuPosterMapper.selectList(queryWrapper);
    }
}
